如果要讓一個變數在不同的頁面都可以呼叫得到,而且都可以獲得相同的變數值。因為@State只能使用在單一頁面,傳入到其它頁面時,其值就不會產生同步。這個時候就必須要使用ObservableObject。
宣告一個物件並且繼承ObservableObject,例如:
class MyObject: ObservableObject {
@Published var count = 0
}
在這個物件內宣告一個變數為@Published,表示這個變數可以產生同步狀態。
接下來製作一個按鈕跟文字,這個按鈕會將變數累加1,例如:
@ObservedObject var myObject = MyObject()
var body: some View {
VStack{
Text("\(myObject.count)")
Button(action: {
myObject.count = myObject.count + 1
}, label: {
Text("Button")
})
}
}
宣告一個變數myObject為MyObject()物件初始化,並且宣告為@ObservedObject。
當按下按鈕時,myObject內的count變數,就會累加1。
接下來製作一個新的頁面,例如:
struct SwiftUIView12_Page2: View {
@ObservedObject var myObject: MyObject
var body: some View {
VStack{
Text("\(myObject.count)")
Button(action: {
myObject.count = myObject.count + 1
}, label: {
Text("Button")
})
}
}
}
一樣宣告myObject變數為MyObject,但這裡不進行物件初始化,這裡可以由呼叫者來帶入。
然後回到第一頁,使用NavigationSplitView來產生導覽可以跳轉到第二頁,例如:
NavigationSplitView {
VStack{
Text("\(myObject.count)")
Button(action: {
myObject.count = myObject.count + 1
}, label: {
Text("Button")
})
NavigationLink {
SwiftUIView12_Page2(myObject: myObject)
} label: {
Text("Go To Page2")
}
}
} detail: {
Text("NavigationSplitView detail")
}
在呼叫SwiftUIView12_Page2時,將變數myObject直接傳入,就表示第二頁也可以使用這個變數,達到一個同步的狀態。
所以當第一頁的按鈕已經累加到10時
顯示如圖:
此時,跳轉到第二頁時,也會同步顯示累加到10
顯示如圖:
而此時如果在第二頁持續累加到20,回到上一頁時,也會同步顯示累加到20。
從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始 Day12 [完]